]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
utils: Simplify URL regex to only support one layer of parentheses
authorFlorian Müllner <fmuellner@gnome.org>
Tue, 27 Feb 2018 12:20:02 +0000 (13:20 +0100)
committerFlorian Müllner <florian.muellner@gmail.com>
Fri, 13 Apr 2018 18:15:44 +0000 (18:15 +0000)
The author of the original URL-matching regex warns[0] that the pattern may
cause certain regex engines to lock up with certain input, namely patterns
that contain parentheses. It turns out SpiderMonkey is affected, but rather
than switching to the author's improved version (that is still crazy), sim-
plify the pattern a bit by removing support for nested parentheses in URLs.
Even a single pair of parentheses is extremely rare, so this is unlikely to
make a noticeable difference (other than not locking up SpiderMonkey of
course) ...

[0] http://daringfireball.net/2010/07/improved_regex_for_matching_urls

js/misc/util.js
tests/unit/url.js

index 1d73d2076f709aea795ca49cbfb123eaa3eef42e..38b67e891fa29bf89d8ddf14c1a7d72a827e57f3 100644 (file)
@@ -17,7 +17,7 @@ const Params = imports.misc.params;
 var SCROLL_TIME = 0.1;
 
 // http://daringfireball.net/2010/07/improved_regex_for_matching_urls
-const _balancedParens = '\\((?:[^\\s()<>]+|(?:\\(?:[^\\s()<>]+\\)))*\\)';
+const _balancedParens = '\\([^\\s()<>]+\\)';
 const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]';
 const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]';
 
index 251725ca621f46aceadcbcc13f9aa3030363f0f9..158316bb41ca1a4b5db077875902d304ca6ee7a4 100644 (file)
@@ -38,6 +38,10 @@ const tests = [
       output: [ { url: 'http://www.gnome.org:99/port', pos: 10 } ] },
     { input: 'This is an ftp://www.gnome.org/ test.',
       output: [ { url: 'ftp://www.gnome.org/', pos: 11 } ] },
+    { input: 'https://www.gnome.org/(some_url,_with_very_unusual_characters)',
+      output: [ { url: 'https://www.gnome.org/(some_url,_with_very_unusual_characters)', pos: 0 } ] },
+    { input: 'https://www.gnome.org/(some_url_with_unbalanced_parenthesis',
+      output: [ { url: 'https://www.gnome.org/', pos: 0 } ] },
 
     { input: 'Visit http://www.gnome.org/ and http://developer.gnome.org',
       output: [ { url: 'http://www.gnome.org/', pos: 6 },
@@ -68,4 +72,4 @@ for (let i = 0; i < tests.length; i++) {
        JsUnit.assertEquals('Test ' + i + ', match ' + j + ' position',
                            match[j].pos, tests[i].output[j].pos);
     }
-}
\ No newline at end of file
+}